﻿#include "widget.h"
#include "ui_widget.h"
#include <QtXml>
#include<QFileDialog>

/*************************************************************
XML: 可扩展标记语言
HTML:超文本标记语言

语法：
    单标记
         <标签名 属性名 = "属性值"/>

    双标记
         <标签名 属性名 = "属性值">
         ....
         <标签名/>

HTML和XML区别：
  1、xml标签和属性可自定义可扩展
     html标签和属性不可以定义
  2、xml注重在数据的本身作为数据承载一个标签的定义就是为了承载一个数据
     html注重的是数据的显示方式  一个标签的使用为了页面的结构化和需求

 ************************************************************/

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
}

Widget::~Widget()
{
    delete ui;
}

//设置英雄属性的结构体
struct Hero
{
    int id;
    QString name;
    QString desc;
};

//xml写入逻辑参考
void Widget::on_writeBtn_clicked()
{


    QDomDocument doc;
    QDomElement root = doc.createElement("root"); //文档对象创建一个标签

    doc.appendChild(root);//root标签添加到文档对象

    auto hero = doc.createElement("Hero");
    root.appendChild(hero);

    //为标签添加属性
    hero.setAttribute("id" , "10086");
    auto name = doc.createElement("Name");
    auto desc = doc.createElement("Desc");
    hero.appendChild(name);
    hero.appendChild(desc);

    name.appendChild(doc.createTextNode("张辽"));
    desc.appendChild(doc.createTextNode("五子良将"));


    QString fileNmae = QFileDialog::getSaveFileName(this,"保存xml");

    QFile file(fileNmae);//文件对象
    if(!file.open(QIODevice::WriteOnly))
    {
        return;
    }

    //保存文件
    QTextStream outStream(&file);//使用文件对象 创建文本流对象
    doc.save(outStream,4);


}

//读取测试
void Widget::on_readBtn_clicked()
{

    QFile file("./TextRead.xml");//要读取的xml文件位置
    if(!file.open(QIODevice::ReadOnly))
    {
        return;
    }

    QVector<Hero> vec;//数据承载容器

    //进行xml数据解析
    QDomDocument doc;
    doc.setContent(&file);//设置xml文档内容为文件对象

    auto root = doc.firstChildElement("root");//查找第一个子标签root
    auto hero = root.firstChildElement("Hero");//从root标签找到第一个子标签Hero

    while(!hero.isNull())
    {
        //进行标签解析
        Hero heroInfo;
        heroInfo.id = hero.attribute("id").toInt();
        heroInfo.name = hero.firstChildElement("Name").text();
        heroInfo.desc = hero.firstChildElement("Desc").text();

         vec.append(heroInfo);

         hero = hero.nextSiblingElement("Hero");//读取下一个标签
    }

    //显示到UI
    QString contents = "";
    for(Hero info : vec)
    {
        contents += "ID:" + QString::number(info.id);
        contents += " Name:" + info.name;
        contents += " Desc:" + info.desc;
        contents += "\n--------------------------------\n";

    }
    ui->textEdit->setText(contents);


}
